home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / cpu / h6280 / 6280dasm.c next >
C/C++ Source or Header  |  2000-05-04  |  10KB  |  252 lines

  1. /*****************************************************************************
  2.  
  3.     6280dasm.c Hudsonsoft Hu6280 (HuC6280/Hu6280a) disassembler
  4.  
  5.     Copyright (c) 1999, 2000 Bryan McPhail, mish@tendril.co.uk
  6.  
  7.     This source code is based (with permission!) on the 6502 emulator by
  8.     Juergen Buchmueller.  It is released as part of the Mame emulator project.
  9.     Let me know if you intend to use this code in any other project.
  10.  
  11.  
  12.     Notes relating to Mame:
  13.  
  14.     The dasm window shows 'real' memory, as executed by the cpu
  15.     The data windows show 'physical' memory, as defined in the memory map
  16.  
  17. ******************************************************************************/
  18.  
  19. #include <stdio.h>
  20. #include "memory.h"
  21. #include "osd_cpu.h"
  22.  
  23. #ifdef MAME_DEBUG
  24.  
  25. extern UINT8 H6280_debug_mmr[8];
  26.  
  27. #define RDOP(addr)   cpu_readmem21( (H6280_debug_mmr[(addr)>>13] << 13) | ((addr)&0x1fff))
  28. #define RDBYTE(addr) cpu_readmem21( (H6280_debug_mmr[(addr)>>13] << 13) | ((addr)&0x1fff))
  29. #define RDWORD(addr) cpu_readmem21( (H6280_debug_mmr[(addr)>>13] << 13) | ((addr)&0x1fff)) \
  30.                  | ( cpu_readmem21( (H6280_debug_mmr[(addr+1)>>13] << 13) | ((addr+1)&0x1fff)) << 8 )
  31.  
  32. enum addr_mode {
  33.     _non=0,      /* no additional arguments */
  34.     _acc,         /* accumulator */
  35.     _imp,         /* implicit */
  36.     _imm,         /* immediate */
  37.     _abs,         /* absolute */
  38.     _zpg,         /* zero page */
  39.     _zpx,         /* zero page + X */
  40.     _zpy,         /* zero page + Y */
  41.     _zpi,         /* zero page indirect */
  42.     _abx,         /* absolute + X */
  43.     _aby,         /* absolute + Y */
  44.     _rel,         /* relative */
  45.     _idx,         /* zero page pre indexed */
  46.     _idy,         /* zero page post indexed */
  47.     _ind,         /* indirect */
  48.     _iax,         /* indirect + X */
  49.     _blk,        /* block */
  50.     _zrl,        /* zero page relative */
  51.     _imz,        /* immediate, zero page */
  52.     _izx,        /* immediate, zero page + X */
  53.     _ima,        /* immediate, absolute */
  54.     _imx         /* immediate, absolute + X */
  55. };
  56.  
  57. enum opcodes {
  58.  
  59.     /* 6502 opcodes */
  60.     _adc=0,_and,  _asl,  _bcc,    _bcs,  _beq,  _bit,  _bmi,
  61.     _bne,  _bpl,  _brk,  _bvc,    _bvs,  _clc,  _cld,  _cli,
  62.     _clv,  _cmp,  _cpx,  _cpy,    _dec,  _dex,  _dey,  _eor,
  63.     _inc,  _inx,  _iny,  _jmp,    _jsr,  _lda,  _ldx,  _ldy,
  64.     _lsr,  _nop,  _ora,  _pha,    _php,  _pla,  _plp,  _rol,
  65.     _ror,  _rti,  _rts,  _sbc,    _sec,  _sed,  _sei,  _sta,
  66.     _stx,  _sty,  _tax,  _tay,    _tsx,  _txa,  _txs,  _tya,
  67.     _ill,
  68.  
  69.     /* Hu6280 extensions */
  70.     _bra,  _stz,  _trb,  _tsb,  _dea,  _ina,  _sax,  _bsr,
  71.     _phx,  _phy,  _plx,  _ply,  _csh,  _csl,  _tam,  _tma,
  72.     _cla,  _cly,  _clx,  _st0,  _st1,  _st2,  _tst,  _set,
  73.     _tdd,  _tia,  _tii,  _tin,  _tai,  _say,  _sxy,
  74.  
  75.     _sm0,  _sm1,  _sm2,  _sm3,  _sm4,  _sm5,  _sm6,  _sm7,
  76.     _rm0,  _rm1,  _rm2,  _rm3,  _rm4,  _rm5,  _rm6,  _rm7,
  77.  
  78.     _bs0,  _bs1,  _bs2,  _bs3,  _bs4,  _bs5,  _bs6,  _bs7,
  79.     _br0,  _br1,  _br2,  _br3,  _br4,  _br5,  _br6,  _br7
  80.  
  81. };
  82.  
  83.  
  84. static const char *token[]=
  85. {
  86.     /* 6502 opcodes */
  87.     "adc", "and", "asl", "bcc", "bcs", "beq", "bit", "bmi",
  88.     "bne", "bpl", "brk", "bvc", "bvs", "clc", "cld", "cli",
  89.     "clv", "cmp", "cpx", "cpy", "dec", "dex", "dey", "eor",
  90.     "inc", "inx", "iny", "jmp", "jsr", "lda", "ldx", "ldy",
  91.     "lsr", "nop", "ora", "pha", "php", "pla", "plp", "rol",
  92.     "ror", "rti", "rts", "sbc", "sec", "sed", "sei", "sta",
  93.     "stx", "sty", "tax", "tay", "tsx", "txa", "txs", "tya",
  94.     "ill",
  95.  
  96.     /* Hu6280 extensions */
  97.     "bra", "stz", "trb", "tsb", "dea", "ina", "sax", "bsr",
  98.     "phx", "phy", "plx", "ply", "csh", "csl", "tam", "tma",
  99.     "cla", "cly", "clx", "st0", "st1", "st2", "tst", "set",
  100.     "tdd", "tia", "tii", "tin", "tai", "say", "sxy",
  101.  
  102.     "smb0", "smb1", "smb2", "smb3", "smb4", "smb5", "smb6", "smb7",
  103.     "rmb0", "rmb1", "rmb2", "rmb3", "rmb4", "rmb5", "rmb6", "rmb7",
  104.  
  105.     "bbs0", "bbs1", "bbs2", "bbs3", "bbs4", "bbs5", "bbs6", "bbs7",
  106.     "bbr0", "bbr1", "bbr2", "bbr3", "bbr4", "bbr5", "bbr6", "bbr7"
  107. };
  108.  
  109. static const unsigned char op6280[512]=
  110. {
  111.   _brk,_imp, _ora,_idx, _sxy,_imp, _st0,_imm, _tsb,_zpg, _ora,_zpg, _asl,_zpg, _rm0,_zpg, /* 00 */
  112.   _php,_imp, _ora,_imm, _asl,_acc, _ill,_non, _tsb,_abs, _ora,_abs, _asl,_abs, _br0,_zrl,
  113.   _bpl,_rel, _ora,_idy, _ora,_zpi, _st1,_imm, _trb,_zpg, _ora,_zpx, _asl,_zpx, _rm1,_zpg, /* 10 */
  114.   _clc,_imp, _ora,_aby, _ina,_imp, _ill,_non, _trb,_abs, _ora,_abx, _asl,_abx, _br1,_zrl,
  115.   _jsr,_abs, _and,_idx, _sax,_imp, _st2,_imm, _bit,_zpg, _and,_zpg, _rol,_zpg, _rm2,_zpg, /* 20 */
  116.   _plp,_imp, _and,_imm, _rol,_acc, _ill,_non, _bit,_abs, _and,_abs, _rol,_abs, _br2,_zrl,
  117.   _bmi,_rel, _and,_idy, _and,_zpi, _ill,_non, _bit,_zpx, _and,_zpx, _rol,_zpx, _rm3,_zpg, /* 30 */
  118.   _sec,_imp, _and,_aby, _dea,_imp, _ill,_non, _bit,_abx, _and,_abx, _rol,_abx, _br3,_zrl,
  119.   _rti,_imp, _eor,_idx, _say,_imp, _tma,_imm, _bsr,_rel, _eor,_zpg, _lsr,_zpg, _rm4,_zpg, /* 40 */
  120.   _pha,_imp, _eor,_imm, _lsr,_acc, _ill,_non, _jmp,_abs, _eor,_abs, _lsr,_abs, _br4,_zrl,
  121.   _bvc,_rel, _eor,_idy, _eor,_zpi, _tam,_imm, _csl,_imp, _eor,_zpx, _lsr,_zpx, _rm5,_zpg, /* 50 */
  122.   _cli,_imp, _eor,_aby, _phy,_imp, _ill,_non, _ill,_non, _eor,_abx, _lsr,_abx, _br5,_zrl,
  123.   _rts,_imp, _adc,_idx, _cla,_imp, _ill,_non, _stz,_zpg, _adc,_zpg, _ror,_zpg, _rm6,_zpg, /* 60 */
  124.   _pla,_imp, _adc,_imm, _ror,_acc, _ill,_non, _jmp,_ind, _adc,_abs, _ror,_abs, _br6,_zrl,
  125.   _bvs,_rel, _adc,_idy, _adc,_zpi, _tii,_blk, _stz,_zpx, _adc,_zpx, _ror,_zpx, _rm7,_zpg, /* 70 */
  126.   _sei,_imp, _adc,_aby, _ply,_imp, _ill,_non, _jmp,_iax, _adc,_abx, _ror,_abx, _br7,_zrl,
  127.   _bra,_rel, _sta,_idx, _clx,_imp, _tst,_imz, _sty,_zpg, _sta,_zpg, _stx,_zpg, _sm0,_zpg, /* 80 */
  128.   _dey,_imp, _bit,_imm, _txa,_imp, _ill,_non, _sty,_abs, _sta,_abs, _stx,_abs, _bs0,_zrl,
  129.   _bcc,_rel, _sta,_idy, _sta,_zpi, _tst,_ima, _sty,_zpx, _sta,_zpx, _stx,_zpy, _sm1,_zpg, /* 90 */
  130.   _tya,_imp, _sta,_aby, _txs,_imp, _ill,_non, _stz,_abs, _sta,_abx, _stz,_abx, _bs1,_zrl,
  131.   _ldy,_imm, _lda,_idx, _ldx,_imm, _tst,_izx, _ldy,_zpg, _lda,_zpg, _ldx,_zpg, _sm2,_zpg, /* a0 */
  132.   _tay,_imp, _lda,_imm, _tax,_imp, _ill,_non, _ldy,_abs, _lda,_abs, _ldx,_abs, _bs2,_zrl,
  133.   _bcs,_rel, _lda,_idy, _lda,_zpi, _tst,_imx, _ldy,_zpx, _lda,_zpx, _ldx,_zpy, _sm3,_zpg, /* b0 */
  134.   _clv,_imp, _lda,_aby, _tsx,_imp, _ill,_non, _ldy,_abx, _lda,_abx, _ldx,_aby, _bs3,_zrl,
  135.   _cpy,_imm, _cmp,_idx, _cly,_imp, _tdd,_blk, _cpy,_zpg, _cmp,_zpg, _dec,_zpg, _sm4,_zpg, /* c0 */
  136.   _iny,_imp, _cmp,_imm, _dex,_imp, _ill,_non, _cpy,_abs, _cmp,_abs, _dec,_abs, _bs4,_zrl,
  137.   _bne,_rel, _cmp,_idy, _cmp,_zpi, _tin,_blk, _csh,_imp, _cmp,_zpx, _dec,_zpx, _sm5,_zpg, /* d0 */
  138.   _cld,_imp, _cmp,_aby, _phx,_imp, _ill,_non, _ill,_non, _cmp,_abx, _dec,_abx, _bs5,_zrl,
  139.   _cpx,_imm, _sbc,_idx, _ill,_non, _tia,_blk, _cpx,_zpg, _sbc,_zpg, _inc,_zpg, _sm6,_zpg, /* e0 */
  140.   _inx,_imp, _sbc,_imm, _nop,_imp, _ill,_non, _cpx,_abs, _sbc,_abs, _inc,_abs, _bs6,_zrl,
  141.   _beq,_rel, _sbc,_idy, _sbc,_zpi, _tai,_blk, _set,_imp, _sbc,_zpx, _inc,_zpx, _sm7,_zpg, /* f0 */
  142.   _sed,_imp, _sbc,_aby, _plx,_imp, _ill,_non, _ill,_non, _sbc,_abx, _inc,_abx, _bs7,_zrl
  143. };
  144.  
  145. /*****************************************************************************
  146.  *    Disassemble a single command and return the number of bytes it uses.
  147.  *****************************************************************************/
  148. int Dasm6280(char *buffer, int pc)
  149. {
  150.     int PC, OP, opc, arg;
  151.  
  152.     PC = pc;
  153.     OP = RDOP(PC);
  154.     OP = OP << 1;
  155.     PC++;
  156.  
  157.     opc = op6280[OP];
  158.     arg = op6280[OP+1];
  159.  
  160.     switch(arg)
  161.     {
  162.         case _acc:
  163.             sprintf(buffer,"%-5sa", token[opc]);
  164.             break;
  165.         case _imp:
  166.             sprintf(buffer,"%s", token[opc]);
  167.             break;
  168.         case _rel:
  169.             sprintf(buffer,"%-5s$%04X", token[opc], (PC + 1 + (signed char)RDBYTE(PC)) & 0xffff);
  170.             PC+=1;
  171.             break;
  172.         case _imm:
  173.             sprintf(buffer,"%-5s#$%02X", token[opc], RDBYTE(PC));
  174.             PC+=1;
  175.             break;
  176.         case _zpg:
  177.             sprintf(buffer,"%-5s$%02X", token[opc], RDBYTE(PC));
  178.             PC+=1;
  179.             break;
  180.         case _zpx:
  181.             sprintf(buffer,"%-5s$%02X,x", token[opc], RDBYTE(PC));
  182.             PC+=1;
  183.             break;
  184.         case _zpy:
  185.             sprintf(buffer,"%-5s$%02X,y", token[opc], RDBYTE(PC));
  186.             PC+=1;
  187.             break;
  188.         case _idx:
  189.             sprintf(buffer,"%-5s($%02X,x)", token[opc], RDBYTE(PC));
  190.             PC+=1;
  191.             break;
  192.         case _idy:
  193.             sprintf(buffer,"%-5s($%02X),y", token[opc], RDBYTE(PC));
  194.             PC+=1;
  195.             break;
  196.         case _zpi:
  197.             sprintf(buffer,"%-5s($%02X)", token[opc], RDBYTE(PC));
  198.             PC+=1;
  199.             break;
  200.         case _abs:
  201.             sprintf(buffer,"%-5s$%04X", token[opc], RDWORD(PC));
  202.             PC+=2;
  203.             break;
  204.         case _abx:
  205.             sprintf(buffer,"%-5s$%04X,x", token[opc], RDWORD(PC));
  206.             PC+=2;
  207.             break;
  208.         case _aby:
  209.             sprintf(buffer,"%-5s$%04X,y", token[opc], RDWORD(PC));
  210.             PC+=2;
  211.             break;
  212.         case _ind:
  213.             sprintf(buffer,"%-5s($%04X)", token[opc], RDWORD(PC));
  214.             PC+=2;
  215.             break;
  216.         case _iax:
  217.             sprintf(buffer,"%-5s($%04X),X", token[opc], RDWORD(PC));
  218.             PC+=2;
  219.             break;
  220.         case _blk:
  221.             sprintf(buffer,"%-5s$%04X $%04X $%04X", token[opc], RDWORD(PC), RDWORD(PC+2), RDWORD(PC+4));
  222.             PC+=6;
  223.             break;
  224.         case _zrl:
  225.             sprintf(buffer,"%-5s$%02X $%04X", token[opc], RDBYTE(PC), (PC + 2 + (signed char)RDBYTE(PC+1)) & 0xffff);
  226.             PC+=2;
  227.             break;
  228.         case _imz:
  229.             sprintf(buffer,"%-5s#$%02X $%02X", token[opc], RDBYTE(PC), RDBYTE(PC+1));
  230.             PC+=2;
  231.             break;
  232.         case _izx:
  233.             sprintf(buffer,"%-5s#$%02X $%02X,x", token[opc], RDBYTE(PC), RDBYTE(PC+1));
  234.             PC+=2;
  235.             break;
  236.         case _ima:
  237.             sprintf(buffer,"%-5s#$%02X $%04X", token[opc], RDBYTE(PC), RDWORD(PC+1));
  238.             PC+=3;
  239.             break;
  240.         case _imx:
  241.             sprintf(buffer,"%-5s#$%02X $%04X,x", token[opc], RDBYTE(PC), RDWORD(PC+1));
  242.             PC+=3;
  243.             break;
  244.  
  245.         default:
  246.             sprintf(buffer,"%-5s$%02X", token[opc], OP >> 1);
  247.     }
  248.     return PC - pc;
  249. }
  250.  
  251. #endif
  252.